﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Support.DTO;
using System.Data.SqlClient;
using System.Data;

namespace DataAccess
{
    public class AfiliadoDAL : BaseSQLDAL
    {

        public int GuardarAfiliado(
            string Transferido,
            string NroInternoTitular,
            string NroInternoFamiliar,
            string NroAfiliadoTitular,
            string NroAfiliadoFamiliar,
            string FechaNacimiento,
            string Nombre,
            string Apellido,
            string Cuil,
            string Nacionalidad,
            string Sexo,
            string EstadoCivil,
            string Discapacitado,
            string NivelDiscapacidad,
            string Estudia,
            string NivelEstudio,
            string Trabaja,
            string Censado,
            string Parentesco,
            string Delegacion,
            string Filial,
            string Calle,
            string CalleNumero,
            string Piso,
            string Departamento,
            string Pallier,
            string Telefono,
            string TelefonoAuxiliar,
            string Provincia,
            string Localidad,
            string CodigoPostal,
            string TipoDocumento,
            string NumeroDocumento,
            string EntidadEmisora,
            string CategoriaTitular,
            string EmpresaId,
            string FechaIngreso,
            string FechaCarga,
            string FechaExcepcion,
            string MotivoExcepcion
        )
        {
            try
            {
                CreateCommand("InsertAfiliado", true);

                //1
                AddCmdParameter("@Transferido", string.IsNullOrEmpty(Transferido) ? string.Empty : Transferido, ParameterDirection.Input, DbType.String);
                //2
                AddCmdParameter("@NroInternoTitular", string.IsNullOrEmpty(NroInternoTitular) ? string.Empty : NroInternoTitular, ParameterDirection.Input);
                //3
                AddCmdParameter("@NroInternoFamiliar", string.IsNullOrEmpty(NroInternoFamiliar) ? string.Empty : NroInternoFamiliar, ParameterDirection.Input);
                //4
                AddCmdParameter("@NroAfiliadoTitular", string.IsNullOrEmpty(NroAfiliadoTitular) ? string.Empty : NroAfiliadoTitular, ParameterDirection.Input);
                //5
                AddCmdParameter("@nroAfiliadoFamiliar", string.IsNullOrEmpty(NroAfiliadoFamiliar) ? string.Empty : NroAfiliadoFamiliar, ParameterDirection.Input);

                AddCmdParameter("@FechaNacimiento", string.IsNullOrEmpty(FechaNacimiento) ? string.Empty : FechaNacimiento, ParameterDirection.Input);
                //6
                AddCmdParameter("@Nombre", string.IsNullOrEmpty(Nombre) ? string.Empty : Nombre, ParameterDirection.Input);
                //7
                AddCmdParameter("@Apellido", string.IsNullOrEmpty(Apellido) ? string.Empty : Apellido, ParameterDirection.Input);
                //8
                AddCmdParameter("@Cuil", string.IsNullOrEmpty(Cuil) ? string.Empty : Cuil, ParameterDirection.Input);
                //9
                AddCmdParameter("@Nacionalidad", string.IsNullOrEmpty(Nacionalidad) ? string.Empty : Nacionalidad, ParameterDirection.Input);
                //10
                AddCmdParameter("@Sexo", string.IsNullOrEmpty(Sexo) ? string.Empty : Sexo, ParameterDirection.Input);
                //11
                if (string.IsNullOrEmpty(EstadoCivil))
                    AddCmdParameter("@EstadoCivil", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@EstadoCivil", Convert.ToInt32(EstadoCivil), ParameterDirection.Input);
                //12
                AddCmdParameter("@Discapacitado", string.IsNullOrEmpty(Discapacitado) ? string.Empty : Discapacitado, ParameterDirection.Input);
                //13
                AddCmdParameter("@NivelDiscapacidad", string.IsNullOrEmpty(NivelDiscapacidad) ? string.Empty : NivelDiscapacidad, ParameterDirection.Input);
                //14
                AddCmdParameter("@Estudia", string.IsNullOrEmpty(Estudia) ? string.Empty : Estudia, ParameterDirection.Input);
                //15
                AddCmdParameter("@NivelEstudio", string.IsNullOrEmpty(NivelEstudio) ? string.Empty : NivelEstudio, ParameterDirection.Input);
                //16
                AddCmdParameter("@Trabaja", string.IsNullOrEmpty(Trabaja) ? string.Empty : Trabaja, ParameterDirection.Input);
                //17
                AddCmdParameter("@Censado", string.IsNullOrEmpty(Censado) ? string.Empty : Censado, ParameterDirection.Input);
                //18
                if (string.IsNullOrEmpty(Parentesco))
                    AddCmdParameter("@Parentesco", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@Parentesco", Convert.ToInt32(Parentesco), ParameterDirection.Input);
                //19
                if (string.IsNullOrEmpty(Delegacion))
                    AddCmdParameter("@Delegacion", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@Delegacion", Convert.ToInt32(Delegacion), ParameterDirection.Input);
                //20
                if (string.IsNullOrEmpty(Filial))
                    AddCmdParameter("@Filial", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@Filial", Convert.ToInt32(Filial), ParameterDirection.Input);
                //21
                AddCmdParameter("@Calle", string.IsNullOrEmpty(Calle) ? string.Empty : Calle, ParameterDirection.Input);
                //22
                if (string.IsNullOrEmpty(CalleNumero))
                    AddCmdParameter("@CalleNumero", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@CalleNumero", Convert.ToInt32(CalleNumero), ParameterDirection.Input);
                //23
                AddCmdParameter("@Piso", string.IsNullOrEmpty(Piso) ? string.Empty : Piso, ParameterDirection.Input);
                //24
                AddCmdParameter("@Departamento", string.IsNullOrEmpty(Departamento) ? string.Empty : Departamento, ParameterDirection.Input);
                //25
                AddCmdParameter("@Pallier", string.IsNullOrEmpty(Pallier) ? string.Empty : Pallier, ParameterDirection.Input);
                //26
                AddCmdParameter("@Telefono", string.IsNullOrEmpty(Telefono) ? string.Empty : Telefono, ParameterDirection.Input);
                //27
                AddCmdParameter("@TelefonoAuxiliar", string.IsNullOrEmpty(TelefonoAuxiliar) ? string.Empty : TelefonoAuxiliar, ParameterDirection.Input);
                //28
                if (string.IsNullOrEmpty(Provincia))
                    AddCmdParameter("@Provincia", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@Provincia", Convert.ToInt32(Provincia), ParameterDirection.Input);
                //29
                if (string.IsNullOrEmpty(Localidad))
                    AddCmdParameter("@Localidad", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@Localidad", Convert.ToInt32(Localidad), ParameterDirection.Input);
                //30
                if (string.IsNullOrEmpty(CodigoPostal))
                    AddCmdParameter("@CodigoPostal", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@CodigoPostal", Convert.ToInt32(CodigoPostal), ParameterDirection.Input);
                //31
                AddCmdParameter("@TipoDocumento", string.IsNullOrEmpty(TipoDocumento) ? string.Empty : TipoDocumento, ParameterDirection.Input);
                //32
                AddCmdParameter("@NumeroDocumento", string.IsNullOrEmpty(NumeroDocumento) ? string.Empty : NumeroDocumento, ParameterDirection.Input);
                //33
                AddCmdParameter("@EntidadEmisora", string.IsNullOrEmpty(EntidadEmisora) ? string.Empty : EntidadEmisora, ParameterDirection.Input);
                //34
                AddCmdParameter("@CategoriaTitular", string.IsNullOrEmpty(CategoriaTitular) ? string.Empty : CategoriaTitular, ParameterDirection.Input);
                //35
                if (string.IsNullOrEmpty(EmpresaId))
                    AddCmdParameter("@EmpresaId", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@EmpresaId", Convert.ToInt32(EmpresaId), ParameterDirection.Input);
               // 37
                AddCmdParameter("@FechaIngreso", string.IsNullOrEmpty(FechaIngreso) ? string.Empty : FechaIngreso, ParameterDirection.Input);

                AddCmdParameter("@FechaCarga", string.IsNullOrEmpty(FechaCarga) ? string.Empty : FechaCarga, ParameterDirection.Input);

                AddCmdParameter("@FechaExcepcion", string.IsNullOrEmpty(FechaExcepcion) ? string.Empty : FechaExcepcion, ParameterDirection.Input);

                AddCmdParameter("@MotivoExcepcion", string.IsNullOrEmpty(MotivoExcepcion) ? string.Empty : MotivoExcepcion, ParameterDirection.Input);

                ExecuteReader();
                Read();
                return Convert.ToInt32(GetOutResult("af_id"));
                
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }

        public List<AfiliadoDTO> BuscarAfilByNroInterno(string nroInterno)
        {
            List<AfiliadoDTO> afiliados = new List<AfiliadoDTO>();

            try
            {

                CreateCommand("BuscarAfilByNroInterno", true);
                AddCmdParameter("@NroInternoTitular", nroInterno, ParameterDirection.Input);

                ExecuteReader();
                while (Read())
                {
                    afiliados.Add(FillDTO(GetDataReader()));
                }
                return afiliados;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }


        public List<AfiliadoDTO> BuscarAfilByNroDocumento(string nroDocumento)
        {
            List<AfiliadoDTO> afiliados = new List<AfiliadoDTO>();

            try
            {

                CreateCommand("BuscarAfilByNroDocumento", true);
                AddCmdParameter("@NroDocumento", nroDocumento, ParameterDirection.Input);

                ExecuteReader();
                while (Read())
                {
                    afiliados.Add(FillDTO(GetDataReader()));
                }
                return afiliados;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }


        public List<AfiliadoDTO> BuscarAfilByNombre(string nombre, string apellido)
        {
            List<AfiliadoDTO> afiliados = new List<AfiliadoDTO>();

            try
            {

                CreateCommand("BuscarAfilByNombre", true);
                AddCmdParameter("@Nombre", string.IsNullOrEmpty(nombre) ? "" : nombre, ParameterDirection.Input);
                AddCmdParameter("@Apellido", string.IsNullOrEmpty(apellido) ? "" : apellido, ParameterDirection.Input);

                ExecuteReader();
                while (Read())
                {
                    afiliados.Add(FillDTO(GetDataReader()));
                }
                return afiliados;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }

        private AfiliadoDTO FillDTO(SqlDataReader reader)
        {
            return new AfiliadoDTO()
            {
                Id = Convert.ToInt32(GetOutResult("af_id")),
                Transferido = Convert.ToString(GetOutResult("af_transferido")),
                NroInternoTitular = Convert.ToString(GetOutResult("af_nroInternoTitular")),
                NroInternoFamiliar = Convert.ToString(GetOutResult("af_nroInternoFamiliar")),
                NroAfiliadoTitular = Convert.ToString(GetOutResult("af_nroAfiliadoTitular")),
                nroAfiliadoFamiliar = Convert.ToString(GetOutResult("af_nroAfiliadoFamiliar")),
                FechaNacimiento = Convert.ToString(GetOutResult("af_fechaNacimiento")),
                Nombre = Convert.ToString(GetOutResult("af_nombre")),
                Apellido = Convert.ToString(GetOutResult("af_apellido")),
                Cuil = Convert.ToString(GetOutResult("af_cuil")),
                Nacionalidad = Convert.ToString(GetOutResult("af_nacionalidad")),
                Sexo = Convert.ToString(GetOutResult("af_sexo")),
                EstadoCivil = Convert.ToString(GetOutResult("af_estadoCivil")),
                Discapacitado = Convert.ToString(GetOutResult("af_discapacitado")),
                NivelDiscapacidad = Convert.ToString(GetOutResult("af_nivelDiscapacidad")),
                Estudia = Convert.ToString(GetOutResult("af_estudia")),
                NivelEstudio = Convert.ToString(GetOutResult("af_nivelEstudio")),
                Trabaja = Convert.ToString(GetOutResult("af_trabaja")),
                Censado = Convert.ToString(GetOutResult("af_censado")),
                Parentesco = Convert.ToString(GetOutResult("af_parentesco")),
                Delegacion = Convert.ToString(GetOutResult("af_delegacion")),
                Filial = Convert.ToString(GetOutResult("af_filial")),
                Calle = Convert.ToString(GetOutResult("af_calle")),
                CalleNumero = Convert.ToString(GetOutResult("af_calleNumero")),
                Piso = Convert.ToString(GetOutResult("af_piso")),
                Departamento = Convert.ToString(GetOutResult("af_departamento")),
                Pallier = Convert.ToString(GetOutResult("af_pallier")),
                Telefono = Convert.ToString(GetOutResult("af_telefono")),
                TelefonoAuxiliar = Convert.ToString(GetOutResult("af_telefonoAuxiliar")),
                Provincia = Convert.ToString(GetOutResult("af_provincia")),
                Localidad = Convert.ToString(GetOutResult("af_localidad")),
                CodigoPostal = Convert.ToString(GetOutResult("af_codigoPostal")),
                TipoDocumento = Convert.ToString(GetOutResult("af_tipoDocumento")),
                NumeroDocumento = Convert.ToString(GetOutResult("af_numeroDocumento")),
                EntidadEmisora = Convert.ToString(GetOutResult("af_entidadEmisora")),
                CategoriaTitular = Convert.ToString(GetOutResult("af_categoriaTitular")),
                EmpresaId = Convert.ToString(GetOutResult("af_empresaId")),
                FechaIngreso = Convert.ToString(GetOutResult("af_fechaIngreso")),
                FechaExcepcion = Convert.ToString(GetOutResult("af_fechaExcepcion")),
                MotivoExcepcion = Convert.ToString(GetOutResult("af_motivoExcepcion")),
                FechaCarga = Convert.ToString(GetOutResult("af_fechaCarga"))
            };
        }


        public int UpdateAfiliado(AfiliadoDTO afiliado)
        {
            try
            {
                CreateCommand("UpdateAfiliado", true);


                AddCmdParameter("@Id", afiliado.Id, ParameterDirection.Input);
                //1
                AddCmdParameter("@Transferido", string.IsNullOrEmpty(afiliado.Transferido) ? string.Empty : afiliado.Transferido, ParameterDirection.Input);
                //2
                AddCmdParameter("@NroInternoTitular", string.IsNullOrEmpty(afiliado.NroInternoTitular) ? string.Empty : afiliado.NroInternoTitular, ParameterDirection.Input);
                //3
                AddCmdParameter("@NroInternoFamiliar", string.IsNullOrEmpty(afiliado.NroInternoFamiliar) ? string.Empty : afiliado.NroInternoFamiliar, ParameterDirection.Input);
                //4
                AddCmdParameter("@NroAfiliadoTitular", string.IsNullOrEmpty(afiliado.NroAfiliadoTitular) ? string.Empty : afiliado.NroAfiliadoTitular, ParameterDirection.Input);
                //5
                AddCmdParameter("@nroAfiliadoFamiliar", string.IsNullOrEmpty(afiliado.nroAfiliadoFamiliar) ? string.Empty : afiliado.nroAfiliadoFamiliar, ParameterDirection.Input);

                AddCmdParameter("@FechaNacimiento", string.IsNullOrEmpty(afiliado.FechaNacimiento) ? string.Empty : afiliado.FechaNacimiento, ParameterDirection.Input);
                //6
                AddCmdParameter("@Nombre", string.IsNullOrEmpty(afiliado.Nombre) ? string.Empty : afiliado.Nombre, ParameterDirection.Input);
                //7
                AddCmdParameter("@Apellido", string.IsNullOrEmpty(afiliado.Apellido) ? string.Empty : afiliado.Apellido, ParameterDirection.Input);
                //8
                AddCmdParameter("@Cuil", string.IsNullOrEmpty(afiliado.Cuil) ? string.Empty : afiliado.Cuil, ParameterDirection.Input);
                //9
                AddCmdParameter("@Nacionalidad", string.IsNullOrEmpty(afiliado.Nacionalidad) ? string.Empty : afiliado.Nacionalidad, ParameterDirection.Input);
                //10
                AddCmdParameter("@Sexo", string.IsNullOrEmpty(afiliado.Sexo) ? string.Empty : afiliado.Sexo, ParameterDirection.Input);
                //11
                if (string.IsNullOrEmpty(afiliado.EstadoCivil))
                    AddCmdParameter("@EstadoCivil", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@EstadoCivil", Convert.ToInt32(afiliado.EstadoCivil), ParameterDirection.Input);
                //12
                AddCmdParameter("@Discapacitado", string.IsNullOrEmpty(afiliado.Discapacitado) ? string.Empty : afiliado.Discapacitado, ParameterDirection.Input);
                //13
                AddCmdParameter("@NivelDiscapacidad", string.IsNullOrEmpty(afiliado.NivelDiscapacidad) ? string.Empty : afiliado.NivelDiscapacidad, ParameterDirection.Input);
                //14
                AddCmdParameter("@Estudia", string.IsNullOrEmpty(afiliado.Estudia) ? string.Empty : afiliado.Estudia, ParameterDirection.Input);
                //15
                AddCmdParameter("@NivelEstudio", string.IsNullOrEmpty(afiliado.NivelEstudio) ? string.Empty : afiliado.NivelEstudio, ParameterDirection.Input);
                //16
                AddCmdParameter("@Trabaja", string.IsNullOrEmpty(afiliado.Trabaja) ? string.Empty : afiliado.Trabaja, ParameterDirection.Input);
                //17
                AddCmdParameter("@Censado", string.IsNullOrEmpty(afiliado.Censado) ? string.Empty : afiliado.Censado, ParameterDirection.Input);
                //18
                if (string.IsNullOrEmpty(afiliado.Parentesco))
                    AddCmdParameter("@Parentesco", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@Parentesco", Convert.ToInt32(afiliado.Parentesco), ParameterDirection.Input);
                //19
                if (string.IsNullOrEmpty(afiliado.Delegacion))
                    AddCmdParameter("@Delegacion", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@Delegacion", Convert.ToInt32(afiliado.Delegacion), ParameterDirection.Input);
                //20
                if (string.IsNullOrEmpty(afiliado.Filial))
                    AddCmdParameter("@Filial", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@Filial", Convert.ToInt32(afiliado.Filial), ParameterDirection.Input);
                //21
                AddCmdParameter("@Calle", string.IsNullOrEmpty(afiliado.Calle) ? string.Empty : afiliado.Calle, ParameterDirection.Input);
                //22
                if (string.IsNullOrEmpty(afiliado.CalleNumero))
                    AddCmdParameter("@CalleNumero", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@CalleNumero", Convert.ToInt32(afiliado.CalleNumero), ParameterDirection.Input);
                //23
                AddCmdParameter("@Piso", string.IsNullOrEmpty(afiliado.Piso) ? string.Empty : afiliado.Piso, ParameterDirection.Input);
                //24
                AddCmdParameter("@Departamento", string.IsNullOrEmpty(afiliado.Departamento) ? string.Empty : afiliado.Departamento, ParameterDirection.Input);
                //25
                AddCmdParameter("@Pallier", string.IsNullOrEmpty(afiliado.Pallier) ? string.Empty : afiliado.Pallier, ParameterDirection.Input);
                //26
                AddCmdParameter("@Telefono", string.IsNullOrEmpty(afiliado.Telefono) ? string.Empty : afiliado.Telefono, ParameterDirection.Input);
                //27
                AddCmdParameter("@TelefonoAuxiliar", string.IsNullOrEmpty(afiliado.TelefonoAuxiliar) ? string.Empty : afiliado.TelefonoAuxiliar, ParameterDirection.Input);
                //28
                if (string.IsNullOrEmpty(afiliado.Provincia))
                    AddCmdParameter("@Provincia", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@Provincia", Convert.ToInt32(afiliado.Provincia), ParameterDirection.Input);
                //29
                if (string.IsNullOrEmpty(afiliado.Localidad))
                    AddCmdParameter("@Localidad", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@Localidad", Convert.ToInt32(afiliado.Localidad), ParameterDirection.Input);
                //30
                if (string.IsNullOrEmpty(afiliado.CodigoPostal))
                    AddCmdParameter("@CodigoPostal", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@CodigoPostal", Convert.ToInt32(afiliado.CodigoPostal), ParameterDirection.Input);
                //31
                AddCmdParameter("@TipoDocumento", string.IsNullOrEmpty(afiliado.TipoDocumento) ? string.Empty : afiliado.TipoDocumento, ParameterDirection.Input);
                //32
                AddCmdParameter("@NumeroDocumento", string.IsNullOrEmpty(afiliado.NumeroDocumento) ? string.Empty : afiliado.NumeroDocumento, ParameterDirection.Input);
                //33
                AddCmdParameter("@EntidadEmisora", string.IsNullOrEmpty(afiliado.EntidadEmisora) ? string.Empty : afiliado.EntidadEmisora, ParameterDirection.Input);
                //34
                AddCmdParameter("@CategoriaTitular", string.IsNullOrEmpty(afiliado.CategoriaTitular) ? string.Empty : afiliado.CategoriaTitular, ParameterDirection.Input);
                //35
                if (string.IsNullOrEmpty(afiliado.EmpresaId))
                    AddCmdParameter("@EmpresaId", -1, ParameterDirection.Input);
                else
                    AddCmdParameter("@EmpresaId", Convert.ToInt32(afiliado.EmpresaId), ParameterDirection.Input);
                // 37
                AddCmdParameter("@FechaIngreso", string.IsNullOrEmpty(afiliado.FechaIngreso) ? string.Empty : afiliado.FechaIngreso, ParameterDirection.Input);

                AddCmdParameter("@FechaCarga", string.IsNullOrEmpty(afiliado.FechaCarga) ? string.Empty : afiliado.FechaCarga, ParameterDirection.Input);

                AddCmdParameter("@FechaExcepcion", string.IsNullOrEmpty(afiliado.FechaExcepcion) ? string.Empty : afiliado.FechaExcepcion, ParameterDirection.Input);

                AddCmdParameter("@MotivoExcepcion", string.IsNullOrEmpty(afiliado.MotivoExcepcion) ? string.Empty : afiliado.MotivoExcepcion, ParameterDirection.Input);

                ExecuteReader();
                Read();
                return Convert.ToInt32(GetOutResult("af_id")) > 0 ? 1 : -1;

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }
    }
}
